package com.chushouya.order.constants;

import com.general.framework.core.enums.IEnum;
import lombok.Getter;

import java.util.Objects;

/**
 * 当当订单状态枚举
 * 
 * @author chushouya
 * @date 2025-10-31
 */
@Getter
public enum DangDangOrderStatusEnum implements IEnum<Integer> {

    /**
     * 0: 待取件 -> 不推送
     */
    WAIT_PICKUP(0, "待取件", OrderStatusEnum.WAIT_PICKUP, false),
    
    /**
     * 40: 上门中 -> 系统状态: 32 待取件
     */
    PICKING_UP(40, "上门中", OrderStatusEnum.WAIT_PICKUP, true),
    
    /**
     * 60: 邮寄中 -> 系统状态: 31 待质检
     */
    IN_TRANSIT(60, "邮寄中", OrderStatusEnum.WAIT_QUALITY, true),
    
    /**
     * 80: 已完成 -> 系统状态: 100 已完成
     */
    COMPLETED(80, "已完成", OrderStatusEnum.COMPLETE, true),
    
    /**
     * 90: 已取消 -> 系统状态: 20 已取消
     * 包含: 重复订单、撤销揽件、拒绝揽件、订单退回、揽件已取消
     */
    CANCELLED(90, "已取消", OrderStatusEnum.CANCELLED, true);

    /**
     * 当当订单状态值
     */
    private final Integer value;
    
    /**
     * 当当订单状态描述
     */
    private final String desc;
    
    /**
     * 映射的系统订单状态
     */
    private final OrderStatusEnum systemStatus;
    
    /**
     * 是否需要推送（更新系统订单状态）
     */
    private final boolean needPush;

    DangDangOrderStatusEnum(Integer value, String desc, OrderStatusEnum systemStatus, boolean needPush) {
        this.value = value;
        this.desc = desc;
        this.systemStatus = systemStatus;
        this.needPush = needPush;
    }

    /**
     * 根据当当状态值获取枚举
     */
    public static DangDangOrderStatusEnum getByValue(Integer value) {
        if (value == null) {
            return null;
        }
        for (DangDangOrderStatusEnum status : values()) {
            if (Objects.equals(status.value, value)) {
                return status;
            }
        }
        return null;
    }

    /**
     * 获取状态描述
     */
    public static String getDesc(Integer value) {
        DangDangOrderStatusEnum status = getByValue(value);
        return status != null ? status.desc : "未知状态";
    }

    /**
     * 获取映射的系统订单状态
     */
    public static OrderStatusEnum getSystemStatus(Integer dangdangStatus) {
        DangDangOrderStatusEnum status = getByValue(dangdangStatus);
        return status != null ? status.systemStatus : null;
    }

    /**
     * 判断是否需要推送（更新系统订单状态）
     */
    public static boolean needPush(Integer dangdangStatus) {
        DangDangOrderStatusEnum status = getByValue(dangdangStatus);
        return status != null && status.needPush;
    }

    @Override
    public Integer value() {
        return this.value;
    }

    @Override
    public String named() {
        return this.desc;
    }
}
